package com.ms.service.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ms.dao.ScoreMapper;
import com.ms.entity.Score;
import com.ms.service.inter.ScoreService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

/**
 * 成绩服务实现类 - 实现ScoreService接口
 */
@Service
@Transactional
public class ScoreServiceImpl extends ServiceImpl<ScoreMapper, Score> implements ScoreService {

    @Autowired
    private ScoreMapper scoreMapper;

    /**
     * 保存成绩信息
     * @param score 成绩对象
     * @return 保存结果
     */
    @Override
    public boolean save(Score score) {
        try {
            return super.save(score);
        } catch (Exception e) {
            throw new RuntimeException("保存成绩信息失败: " + e.getMessage(), e);
        }
    }

    /**
     * 根据ID查找成绩
     * @param sId 成绩ID
     * @return 成绩对象
     */
    @Override
    public Score findById(Integer sId) {
        try {
            return this.getById(sId);
        } catch (Exception e) {
            throw new RuntimeException("根据ID查找成绩失败: " + e.getMessage(), e);
        }
    }

    /**
     * 更新成绩信息
     * @param score 成绩对象
     * @return 更新结果
     */
    @Override
    public boolean update(Score score) {
        try {
            // 使用MyBatis-Plus的更新方法
            return this.updateById(score);
        } catch (Exception e) {
            throw new RuntimeException("更新成绩信息失败: " + e.getMessage(), e);
        }
    }

    /**
     * 删除成绩
     * @param sId 成绩ID
     * @return 删除结果
     */
    @Override
    public boolean delete(Integer sId) {
        try {
            // 使用MyBatis-Plus的删除方法
            return this.removeById(sId);
        } catch (Exception e) {
            throw new RuntimeException("删除成绩失败: " + e.getMessage(), e);
        }
    }
    
    /**
     * 根据eventId和轮次查询成绩数据，并根据s_type排序
     * @param eventId 项目ID
     * @param rankId 轮次
     * @return 成绩列表
     */
    @Override
    public List<Score> findByEventIdAndRankIdWithOrder(Integer eventId, Integer rankId) {
        // 使用MyBatis-Plus QueryWrapper构建查询条件
        com.baomidou.mybatisplus.core.conditions.query.QueryWrapper<Score> queryWrapper = 
                new com.baomidou.mybatisplus.core.conditions.query.QueryWrapper<>();
        
        // 添加查询条件
        queryWrapper.eq("event_id", eventId);
        queryWrapper.eq("rank_id", rankId);
        
        // 先查询出所有符合条件的数据
        List<Score> scores = this.list(queryWrapper);
        
        // 根据s_type值进行排序
        scores.sort((s1, s2) -> {
            // 如果s_type为空，则不需要排列
            if (s1.getSType() == null && s2.getSType() == null) {
                return 0;
            }
            if (s1.getSType() == null) {
                return -1;
            }
            if (s2.getSType() == null) {
                return 1;
            }
            
            // 根据s_type值确定排序方式
            switch (s1.getSType()) {
                case 1:
                case 2:
                    // s_type为1或2时从大到小排列
                    if (s1.getSScore() != null && s2.getSScore() != null) {
                        return s2.getSScore().compareTo(s1.getSScore());
                    } else if (s1.getSDistance() != null && s2.getSDistance() != null) {
                        return s2.getSDistance().compareTo(s1.getSDistance());
                    } else if (s1.getSTimeValue() != null && s2.getSTimeValue() != null) {
                        return s2.getSTimeValue().compareTo(s1.getSTimeValue());
                    }
                    return 0;
                case 3:
                    // s_type为3时从小到大排列
                    if (s1.getSScore() != null && s2.getSScore() != null) {
                        return s1.getSScore().compareTo(s2.getSScore());
                    } else if (s1.getSDistance() != null && s2.getSDistance() != null) {
                        return s1.getSDistance().compareTo(s2.getSDistance());
                    } else if (s1.getSTimeValue() != null && s2.getSTimeValue() != null) {
                        return s1.getSTimeValue().compareTo(s2.getSTimeValue());
                    }
                    return 0;
                default:
                    return 0;
            }
        });
        
        return scores;
    }
}